﻿///////////////////////////////////////////////////////////////////////////////
///
/// Cylan Client Core
/// Copyright (C) Shenzhen Cylan Tech. Co., Ltd. 2012
///
/// \file       SGA.h
/// \brief      SGA相关API
///
///////////////////////////////////////////////////////////////////////////////
#ifndef CYLAN_SGA_H
#define CYLAN_SGA_H

#include "Error.h"
#include "Core.h"

/**
 * @struct ICAB_RESOURCE
 * @brief IServer信息
 */
//typedef struct Client_Version
//{
//    const char *Version;
//    int ForceUpgrade;
//    const char *Tips;
//    const char *PackageUrl;
//    const char *PackageName;
//} CLIENT_VERSION;

/**
 * @fn CC_STATUS SGADownloadCert(const char* Server, const char* Username, const char* Password, const char* SaveTo, int *SGAError)
 * @brief 下载用户证书
 * @param Server 服务器地址, "地址[:端口]" 格式字符串
 * @param Username 用户账号
 * @param Password 用户密码
 * @param SaveTo 证书文件保存路径
 * @param SGAError SGA错误码
 * @retval ERR_SUCCESS 登录成功
 * @retval ERR_SGACALL SGA错误, 此时参考SGAError返回值
 */
CC_STATUS SGADownloadCert(const char* Server,
                          const char* Username,
                          const char* Password,
                          const char* SaveTo,
                          int *SGAError);

/**
 * @fn CC_STATUS SGADownloadFile(const char* Server, const char* Path, const char* SaveTo)
 * @brief 下载文件
 * @param Server 服务器地址, "地址[:端口]" 格式字符串
 * @param Path 下载文件的路径
 * @param SaveTo 文件保存路径
 * @retval ERR_SUCCESS 登录成功
 */
CC_STATUS SGADownloadFile(const char* Server,
                          const char* Path,
                          const char* SaveTo);

/**
 * @fn CC_STATUS SGAPostSSOUserData(SESSION_OBJECT *Session, int SSOID, const char *UserData)
 * @brief 提交单点登陆数据到SGA
 * @param Session SGA会话的session
 * @param SSOID 单点登陆模版ID
 * @param UserData 提交用户数据, "&变量1=xxx&变量2=xxxx"格式
 * @retval ERR_SUCCESS 提交数据成功
 */
CC_STATUS SGAPostSSOUserData(void *Session, 
                             int SSOID, 
                             const char *UserData);

/**
 * @fn CC_STATUS ICABSendOpenLOGToSGA(void *Session, int ResID, const char *ResName, const char *ResType)
 * @brief 提交用户数据到SGA
 * @param Session SGA会话的session
 * @param ResID 资源ID
 * @param ResName 资源名称
 * @param ResType 资源类型
    resour_type有以下几种:
    "tool_sso"
    "web_sso"
    "ip_tunnel"
    "tcp_tunnel"
    "video"
    "cab"
    "bsrc"
 * @retval ERR_SUCCESS 提交成功
 */                            
CC_STATUS SGASendOpenLOGToSGA(void *Session, 
                               int ResID, 
                               const char *ResName, 
                               const char *ResType);
                               
                               
/**
 * @fn CC_STATUS SGASendTraffic(void *Session, int NetWorkType, int TrafficDown, int TrafficUp)
 * @brief 提交客户端流量数据到SGA
 * @param Session SGA会话的session
 * @param TrafficDown 下行流量
 * @param TrafficDown 上行流量
 * @param NetWorkType
          0 < wifi
          1 < 3G           
 * @retval ERR_SUCCESS 提交成功
 */                            
CC_STATUS SGASendTraffic(void *Session, int NetWorkType, int TrafficDown, int TrafficUp);                                       

/**
 * @fn int SGAMultiLine(CSESSION_LOGIN_SERVER *LoginServers, int Number);
 * @brief CSESSION_LOGIN_SERVER *LoginServers 数组首地址
 * @param Number 数组个数
 * @retval int 返回连接到SGA最快的可用 IP 索引值
 */
int SGAMultiLine(CSESSION_LOGIN_SERVER *LoginServers, int Number);

/**
 * @fn CC_STATUS SGAGetConfig(const char *Server, const char *SaveTo)
 * @brief 获取服务器配置信息
 * @param Server
 * @param Buffer
 * @param Len
 * @retval ERR_SUCCESS 提交成功
 */
CC_STATUS SGAGetConfig(const char *Server, char *Buffer, int Len);

//还没有准备好，所以，先屏蔽
//CC_STATUS SGAIsNeedImageCode(const char *Server, char *szResult);

/**
 * @fn SGAGetVCode(const char *Server, char *szVCode)
 * @brief 获取验证码数据
 * @param IpAddr
 * @param image code data  //xxx.bmp
 * @retval ERR_SUCCESS 提交成功
 */
CC_STATUS SGAGetVCode( CHANDLE Session, const char *Server, const char *SaveTo);

CC_STATUS SGADownloadFileBySession(CHANDLE Session, 
                             const char* Path,
                             const char* SaveTo);

/**
 * @fn CC_STATUS SGADisconnIserverSession(CHANDLE Session, const char *Server)
 * @brief request sga to request to all iServer to disconnect icab session
 * @param Session
 * @param Server
 * @retval ERR_SUCCESS 提交成功
 */
CC_STATUS SGADisconnIserverSessionBySession( CHANDLE Session );

/**
* @fn CC_STATUS SGAGetClientUpgrade(const char *Server, CLIENT_VERSION *version, int Len)
* @brief 获取客户端更新
* @param Server
* @param Buffer
* @param Len
* @retval ERR_SUCCESS 提交成功
*/
//CC_STATUS SGAGetClientUpgrade(const char *Server, CLIENT_VERSION *version, int *Size);

#endif /* CYLAN_SGA_H */
